NAZWA PROGRAMU : CrackMe 1 by Rev-easy
DATA           : 20.05.2003
CO             : Tutorial
AUTOR          : Xibus
NARZDZIA      : Softice
SKILL          : easy


Cze wszystkim!  

UWAGA Nie ponosze adnej odpowiedzialnoci jak co sobie zepsujesz
lub zrobisz krzywde.Tekst jest pisany dla pocztkujcych dlatego niektre 
rzeczy mog by wyjanione do przesady.Jeli znajdziesz jaki bedy to daj zna.

*****************************************************************************

OK.Uruchamiamy naszego proga i w puste pole co wpisujemy, ja wpisaem 2143.
Teraz uruchamiamy SI (tak bde nazywa SoftIce) i zakadamy puapke
 
bpx nazwa_funkcji_api

Jeli niewiesz po co to zaraz postaram ci si to wyjani.Ot jest to puapka na wywoanie 
funkcji , chodzi oto e SI przerwie prace programu jeli ten bdzie prbowa 
wywoa funkcje nazwa_funkcji_api.Zaley nam aby SI przerwa prace programu gdy ten bedzi pobiera 
tekst ktry wpisalimy w puste pole wic musimy zaoyc puapke na wywoanie funkcji pobierajcej
tekst, najczciej uzywane s GETDlgItemTextA i GetWindowTextA.
Podpowiem ci e program apie si na  GETDlgItemTextA wic piszemy

bpx GETDlgItemTextA 

wychodzimy z SI, naciskamy sprawd i znw ldujemy w SI.
Naszym ocz ukazuje si taki kod :

*************************************
1)  CALL USER32! GetDlgITemTextA 
2)  CMP  EAX,00
3)  JZ   00401151
4)  JMP  00401109
*************************************

1)Wywoanie funkcji GetDlgITemTextA.Jeli przejedziesz ekranem do gory zabaczysz kilka instrukcj
  PUSH, ktre s argumentami funkcj.Nas interesuje jeden PUSH 004031D1 ktry odklada na stos dane
  z pod aresu 004031D1, ale zanim sprawdzimy co ten PUSH pobiera postaram si w skrcie wyjani 
  jak ta instrukcja dziala i co to jest stos. Stos jak sama nazwa wskazuje jest stosem w naszym 
  wypadku jest stosem danych i mona go porwna do stosu ksiek na ktry odkadamy po koleji 
  ksiaki A B C D . Na samej gorze znajduje si ksika D wic jeli chcemy zabra ksike B to 
  najpierw musimy zdj ksiki D i C a dopiero potem uzyskujemy dostp do ksiki B czyli 
  elementy ze stosu zdejmuje sie w odwronej kolejnoci ni kolejno odkadania,Jli jest to dla
  ciebie malo jasne przeczytaj dalej a potem sprbuj to przeczyta jeszcze raz.
  Aby sprawdzi co znajduje si pod jakim adresem uywamy komendy 
  
  D adres

  Nas interesuje 004031D1 wic piszemy

  D 004031D1
 
  I naszym ocz ukazuje sie tekst ktry wpisalimy w puste pole, jeli dalej w programie bdzie
  co robione z tym adresem t bd to operacje na naszym tekcie i naley je zawsze dokadnie 
  analizowa. 
2)Porwnanie wartoci rejestru EAX z 00. Chodzi oto e funkcja ilo pobranych znakw zwraca w
  EAX (dla mnie 4) i to porwnywane jest z 0.
3)Skok jeli zero. Jeli wynik porwnania CMP EAX,00 by pozytywny czyli nic nie wpisalimy to
  skok JZ si wykonuje i przeniesie nas pod adres 00401151 gdzi nastpuje zakoczenie programu
  i wywietlenie komunikatu " Wpisz co " (ja wpisaem 4 liczby czyli wynik bdzi negatywny i 
  skok si nie wykona).
4)JMP jest to skok bezporedni ktry niezalenie od warunkow skoacze pod podany adres tu 00401109.
  Przechodzimy przez ten skok i ldujemy w takim miejscu:

***************************
5)  PUSH 004031D1
6)  POP  EDX
7)  PUSH EAX
8)  CMP  BYTE PTR[EDX],30
9)  JL   00401123
10) CMP  BYTE PTR[EDX],39
11) JA   00401123
12) INC  EDX
13) DEC  EAX
14) CMP  EAX,00
15) JZ   004010C8
16) JMP  00401166
****************************

5)Na stos jest odkadany adres naszego tekstu.
6)Ze stosu jest bobierany element ostatnio odoony czyli 004031D1 i adowany do EDX.
7)Na stos odkadana jest warto rejestru EAX (ilo znakw wpisanego tekstu).
8)Warto z pod adresu na ktry wskazuje EDX jest porownywana z 30. Do EDX instrukcja POP wrzucia
  adres tekstu ktry wpisalimy, wic EDX wskazuje na adres 004031D1 a dlaczego jest porwnywane 
  z wartocia adresu a nie adresem poniewa EDX zosta ujty w nawias klamrowy [EDX] czyli
   EDX   - Adres na ktry wszkazuje EDX.
  [EDX]  - Warto z pod adresu na ktry wskazuje EDX.
  A co to jest 30 jest to warto HEX jakiego znak luknij do tablicy i co? Tak to "0" czyli 
  pierwszy znak wpisanego tekstu porownywany jest z zerem.
9)Skocz jeli mniej.Jeli znak ktry wpisalimy jest mniejszy od zera to nastpuje skok.
10)To samo porwnanie co przy 8) tylko e porwnuje z 39.
11)Skocz jeli wicej.Jeli nasz znak jest wikszy od 39 to nastpi skok.
12)Warto rejestru EDX zwikszana jest o jeden czyli EDX dzi teraz wskazywa na kolejny znak
   naszego tekstu.
13)Warto rejestru EAX zmniejszana jest o jeden.
14)Porwnanie rejestru EAX z zerem. 
15)Skok jeli EAX=00 , czyli gdy t tekst nie posiada wicej zadnych znakw.
16)Skok bezwarunkowy.

   Opisany kawaek kodu to po prostu ptla ktora sprawdza czy wpisany znak jest liczb jeli nie
   to w lini 9) lub 11) nastpi skok i pojawi si komunikat "Wpisz w pole tylko liczby".
   Nastpnie zwikszane jest EDX (wskazuje na adres kolejnego znaku) i zmniejszane EAX 
   (ilo znakw) i jsli tekst posiada jakie znaki to ptla jest powtarzana a jeli nie to 
   to w lini 15) nastpuje skok dalej i Ldujemy tutaj:

*********************
17) POP EAX 
18) CMP EAX,08
19) JZ 00401166
*********************

17) Do EAX wadana jest ilo znakw.
18) Porwnywanie iloci znakw z 8.
19) Jeli wynik porownania zero czyli nasz serial ma 8 znakw skocz pod wskazany adres.Linia to
    informuje nas ze musimy wpisa serial zawierajcy nie mniej nie wicej tylko 8 znakw, jeli
    tekst ktry wpisalimy nie ma 8 znakw musimy:
    a)Wyj z programu, wpisa omiocyfrowy kod,
    b)Zmieni flage Z,
    c)Zmienic instrukcje na przeciwn,
    d)Zrobi co tylko chcesz by i dalej.
    Ja wybraem moliwo c) zmienie instrukcje na przeciwn czyli JZ na JNZ.W SI robi si to tak
 
    a adres_pod_ktorym_chcemy_zmienia   

    Jeli akurat jestemy na lini ktr chcemy zmieni wystarczy sama "a" a nastpnie piszemy:

    JNZ 00401166

    Naciskamy 2 razy enter i ju mamy zmienion instrukcje na JNZ, pamitaj aby przed wprowadzeniem 
    poprawnego seriala wyczy i wczy program ponownie poniewa w chwili obecnej przy 8 
    cyfrowym kodzie program uzna e ilo liter musi by rna od 8 a jest dokadnie odwrotnie.

*********************   
20) PUSH 004031D1
21) POP  EAX
22) XOR  DWORD PTR[EAX],574E5465
23) ADD  EAX,04
24) XOR  DWORD PTR[EAX],505F564B
25) SUB  EAX,04
26) PUSH EAX
*********************

20)Na stos jest odkadany adres wpisanego seriala.
21)DO EAX jest adowany ten wanie adres.
22)Xorowanie 4 pierwszych znakw naszego seriala z 574E5465.Xorowanie(alternatywa logiczna) jest
   instrukcja ktrej dziaanie najlepiej wyjani na przykadzie.

   0 XOR 0 = 0
   0 XOR 1 = 1 
   1 XOR 0 = 1
   1 XOR 1 = 0
   
   Jak wiemy kad liczbe da si zapisa w postaci zerojedynkowej(binarnej) i tak np.
   Liczba 65H to 1100101 binarnie sprbujmy j zxorowa z 04H = 100B

            01100101   65H
            00000100   04H
           ----------------
            01100001   61H
  
   Jest to chyba jasne a ja dodam tylko ze instrukcja to jest odwrotna sama w sobie i stosuje si
   j do zerowania rejestrow np XOR EBX,EBX wyzeruje rejestr EBX.
23)Dodanie 4 do EAX (Teraz rejestr wskazuje na adres kolejnych 4 znakw wpisanego seriala).
24)Xorowanie 2 czwrki liczb seriala z 505F564B.
25)Odjcie 4 od EAX (Wskazuje na pierwsze 4 liczby). 
26)Na stos idzie EAX.
   Idziemy dalej a do momentu

*******************************
27) CMP DWORD PTR[EAX],65766552
28) JNZ 00401105
29) ADD EAX,04
30) CMP DWORD PTR[EAX],646E6572
31) JNZ 00401105
********************************

    OK tutaj mamy procke sprawdzajc poprawno wpisanego serial.
27) Porownuje pierwsze 4 zxorowane liczby naszego seriala z 65766552.
28) Jeli s rne ten skok si wykona.
29) Bez komentarza.
30) Kolejne 4 zxorowane liczby porownuje z 646E6572.
31) I znow jeli rne skok si wykona.

   Wiemy e jeli porownanie naszego seriala w liniach 27) i 30) nie wypadnie pomylnie otrzymamy 
   komunikat o zym kodzie, wic jak temu zaradzi?. Ot wiemy e  pierwsze 4 liczby naszego 
   zxorowanego seriala musz by rwne 65766552, e wczeniej byy zxorowane z 574E5465 oraz e
   xorowanie jest operacj odwrotn. Teraz wystarczy tylko zxorowa te 2 liczby i mamy 4 pierwsze
   liczby naszego seriala, zastanawiasz si jak to zrobi w SI bardzo prosto

   ? pierwsz_liczba ^ druga_liczba   

 
  Po zxorowaniu naszych liczb otrzymasz co takiego 
 
  ? 65766552 ^ 574E5465
  32383137 0842543415 2817
  \      / \        / \  / 
   HEX         DEC    ASCI

  Wynikiem jest 2817 jednak jeli cos xorujemy to wynik czytamy od tylu czyli poprawne 4 pierwsze 
  litery to 7182 a kolejne 4?
  No c niektore rzeczy trzeba robi samemu, powodzenia.


  Jeli masz jakie pytania, wtpliwoci lub czego nierozumiesz pisz mialo 
**************************************xibus@Wp.pl***********************************************

Pozdrawiam wszystkich crackerw i coderw!   
   
 
  